package main

import (
	"fmt"
	"io"
	"log"
	"os"
	"time"

	"../pb"
	"google.golang.org/grpc"
)

var (
	Version = "1.0"
)

func main() {
	now := time.Now().Format("150405")
	logger, err := os.OpenFile("log-"+now+".txt", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0777)
	if err != nil {
		log.Panicln(err)
	}
	log.SetOutput(io.MultiWriter(os.Stdout, logger))

	fmt.Println("====================================\r\n")
	fmt.Println("欢迎使用RdfService\r")
	fmt.Println("当前版本：", Version)
	fmt.Println("\r\n====================================\r\n")

	fmt.Println("客户端配置：\r")
	ctl := NewController()
	ctl.InputUserInfo()
	if err = ctl.LoadConfig("config.yml"); err != nil {
		log.Printf("[Error] 无法加载配置文件：config.yml\r\n")
		log.Printf("[Error] %v\r", err)
		fmt.Println("\r\n====================================\r\n")
		fmt.Println("程序结束，请按任意键退出客户端。")
		fmt.Scanln()
		os.Exit(1)
	}

	fmt.Printf("\r\n区号：%s\r\n", ctl.LatnId)
	fmt.Printf("文件保存位置：%s\r\n", ctl.BasePath)
	fmt.Printf("日志文件：log.txt，传输结果：result.txt，失败列表：fail.txt。\r\n")

	fmt.Println("\r\n====================================\r\n")

	fmt.Println("日志信息：\r")
	log.Printf("连接服务器.\r\n")
	err = ctl.CheckAvailable()
	if err != nil {
		log.Println(err)
		fmt.Println("\r\n====================================\r\n")
		fmt.Println("程序结束，请按任意键退出客户端。")
		fmt.Scanln()
		os.Exit(1)
	}

	log.Printf("检查更新. 当前版本: %s\r\n", Version)
	err = ctl.CheckUpdate(Version)
	if err != nil {
		log.Println(err)
		fmt.Println("\r\n====================================\r\n")
		fmt.Println("程序结束，请按任意键退出客户端。")
		fmt.Scanln()
		os.Exit(1)
	}

	log.Println("建立远程调用连接.\r")
	conn, err := grpc.Dial(ctl.Config.ServerIP+":"+ctl.Config.GrpcPort, grpc.WithInsecure())
	if err != nil {
		log.Println("[Error] 建立远程调用连接失败.\r")
		log.Println("[Error] grpc.Dial: %v\r", err)
		fmt.Println("\r\n====================================\r\n")
		fmt.Println("程序结束，请按任意键退出客户端。")
		fmt.Scanln()
		os.Exit(1)
	}
	defer conn.Close()

	client := pb.NewRfdServiceClient(conn)
	ctl.SetDispatcher(client)

	if err != nil {
		log.Println(err)
		fmt.Println("\r\n====================================\r\n")
		fmt.Println("程序结束，请按任意键退出客户端。")
		fmt.Scanln()
		os.Exit(1)
	}

	go ctl.ListenFeedback()

	err = ctl.DownloadFile()
	if err != nil {
		log.Printf("[Error] %v", err)
		log.Println("[Error] 读取文件失败： ", ctl.InfoFile)
		fmt.Println("\r\n====================================\r\n")
		fmt.Println("程序结束，请按任意键退出客户端。")
		fmt.Scanln()
		os.Exit(1)
	}

	fmt.Println("\r\n====================================\r\n")
	fmt.Println("传输结果：")
	ctl.Finish()

	fmt.Println("\r\n====================================\r\n")
	fmt.Println("程序结束，请按任意键退出客户端。")
	fmt.Scanln()
}
